package ihm;

import java.text.SimpleDateFormat;
import java.util.Scanner;

import reservation.Serveur;
import data.VilleHelper;

public abstract class Interface {
	/**
	 * Format de date utilisé
	 */
	protected static SimpleDateFormat dateFormat = new SimpleDateFormat(
			"dd/MM/yyyy k:m");
	
	/**
	 * Lance un client et met la console en attente d'une commande. Si une
	 * commande est tapée elle est analysée puis exécutée, sinon un message
	 * d'erreur s'affiche et une nouvelle commande est demandée.
	 */
	public void start() {
		Command command = new Command(CommandWord.UNKNOWN, null, null);
		Parser parser = new Parser();
		// initialize le serveur
		Serveur.getInstance();
		
		presentation();

		command = parser.getCommand();
		while (command.getCommandWord() != CommandWord.QUIT) {
			if (command.getCommandWord().equals(CommandWord.UNKNOWN)) {
				System.out.println("Commande inconnue.");
			} else {
				process(command);
			}
			command = parser.getCommand();
		}

		goodBye();
	}

	/**
	 * Analyse une commande et exécute les actions associées
	 * 
	 * @param comdW
	 *            Commande tapée dans la console
	 */
	protected abstract void process(Command command);

	/**
	 * Affiche la présentation de l'interface
	 */
	protected abstract void presentation();

	/**
	 * Affiche un text d'au revoir
	 */
	protected abstract void goodBye();

	/**
	 * Affiche la liste des éléments de type le deuxieme mot de la commande
	 */
	protected void print(Command command) {
		if ("trajet".equals(command.getSecondWord())) {
			Serveur.getInstance().listeTrajets();
		} else if ("transport".equals(command.getSecondWord())) {
			Serveur.getInstance().listeTransports();
		} else if ("ville".equals(command.getSecondWord())) {
			VilleHelper.showAll();
		} else {
			System.out.println("Erreur: Type vide ou qui n'existe pas !");
		}
	}

	protected void printHelp() {
		System.out.println("## AIDE ##");
		System.out.println("# Les commandes #");
		System.out.println("- Aide: help");
		System.out.println("- Afficher: print [ville | transport | trajet | billet]");
	}
	
	protected void printChevrons() {
		System.out.print(">> ");
	}
	
	protected int recupererNum(Scanner in) {
		printChevrons();
		try {
			return Integer.parseInt(in.nextLine());
		} catch (Exception e) {
			return -1;
		}
	}
}
